home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_xemacs.idb / usr / freeware / lib / xemacs-20.4 / lisp / packages / spell.el.z / spell.el
Encoding:
Text File  |  1998-05-21  |  5.0 KB  |  157 lines

  1. ;;; spell.el --- spelling correction interface for Emacs.
  2.  
  3. ;; Copyright (C) 1985 Free Software Foundation, Inc.
  4.  
  5. ;; Maintainer: FSF
  6. ;; Keywords: wp, unix
  7.  
  8. ;; This file is part of XEmacs.
  9.  
  10. ;; XEmacs is free software; you can redistribute it and/or modify it
  11. ;; under the terms of the GNU General Public License as published by
  12. ;; the Free Software Foundation; either version 2, or (at your option)
  13. ;; any later version.
  14.  
  15. ;; XEmacs is distributed in the hope that it will be useful, but
  16. ;; WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  18. ;; General Public License for more details.
  19.  
  20. ;; You should have received a copy of the GNU General Public License
  21. ;; along with XEmacs; see the file COPYING.  If not, write to the Free
  22. ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  23. ;; 02111-1307, USA.
  24.  
  25. ;;; Synched up with: FSF 19.34.
  26.  
  27. ;;; Commentary:
  28.  
  29. ;; This mode provides an Emacs interface to the UNIX spell(1) program.
  30. ;; Entry points are `spell-buffer', `spell-word', `spell-region' and
  31. ;; `spell-string'.  These facilities are documented in the Emacs user's
  32. ;; manual.
  33.  
  34. ;;; Code:
  35.  
  36. (defvar spell-command "spell"
  37.   "*Command to run the spell program.")
  38.  
  39. (defvar spell-filter nil
  40.   "*Filter function to process text before passing it to spell program.
  41. This function might remove text-processor commands.
  42. nil means don't alter the text before checking it.")
  43.  
  44. ;;;###autoload
  45. (put 'spell-filter 'risky-local-variable t)
  46.  
  47. ;;;###autoload
  48. (defun spell-buffer ()
  49.   "Check spelling of every word in the buffer.
  50. For each incorrect word, you are asked for the correct spelling
  51. and then put into a query-replace to fix some or all occurrences.
  52. If you do not want to change a word, just give the same word
  53. as its \"correct\" spelling; then the query replace is skipped."
  54.   (interactive)
  55.   (spell-region (point-min) (point-max) "buffer"))
  56.  
  57. ;;;###autoload
  58. (defun spell-word ()
  59.   "Check spelling of word at or before point.
  60. If it is not correct, ask user for the correct spelling
  61. and `query-replace' the entire buffer to substitute it."
  62.   (interactive)
  63.   (let (beg end spell-filter)
  64.     (save-excursion
  65.      (if (not (looking-at "\\<"))
  66.      (forward-word -1))
  67.      (setq beg (point))
  68.      (forward-word 1)
  69.      (setq end (point)))
  70.     (spell-region beg end (buffer-substring beg end))))
  71.  
  72. ;;;###autoload
  73. (defun spell-region (start end &optional description)
  74.   "Like `spell-buffer' but applies only to region.
  75. Used in a program, applies from START to END.
  76. DESCRIPTION is an optional string naming the unit being checked:
  77. for example, \"word\"."
  78.   (interactive "r")
  79.   (let ((filter spell-filter)
  80.     (buf (get-buffer-create " *temp*")))
  81.     (save-excursion
  82.      (set-buffer buf)
  83.      (widen)
  84.      (erase-buffer))
  85.     (message "Checking spelling of %s..." (or description "region"))
  86.     (if (and (null filter) (= ?\n (char-after (1- end))))
  87.     (if (string= "spell" spell-command)
  88.         (call-process-region start end "spell" nil buf)
  89.       (call-process-region start end shell-file-name
  90.                    nil buf nil "-c" spell-command))
  91.       (let ((oldbuf (current-buffer)))
  92.     (save-excursion
  93.      (set-buffer buf)
  94.      (insert-buffer-substring oldbuf start end)
  95.      (or (bolp) (insert ?\n))
  96.      (if filter (funcall filter))
  97.      (if (string= "spell" spell-command)
  98.          (call-process-region (point-min) (point-max) "spell" t buf)
  99.        (call-process-region (point-min) (point-max) shell-file-name
  100.                 t buf nil "-c" spell-command)))))
  101.     (message "Checking spelling of %s...%s"
  102.          (or description "region")
  103.          (if (save-excursion
  104.           (set-buffer buf)
  105.           (> (buffer-size) 0))
  106.          "not correct"
  107.            "correct"))
  108.     (let (word newword
  109.       (case-fold-search t)
  110.       (case-replace t))
  111.       (while (save-excursion
  112.           (set-buffer buf)
  113.           (> (buffer-size) 0))
  114.     (save-excursion
  115.      (set-buffer buf)
  116.      (goto-char (point-min))
  117.      (setq word (downcase
  118.              (buffer-substring (point)
  119.                        (progn (end-of-line) (point)))))
  120.      (forward-char 1)
  121.      (delete-region (point-min) (point))
  122.      (setq newword
  123.            (read-input (concat "`" word
  124.                    "' not recognized; edit a replacement: ")
  125.                word))
  126.      (flush-lines (concat "^" (regexp-quote word) "$")))
  127.     (if (not (equal word newword))
  128.         (progn
  129.          (goto-char (point-min))
  130.          (query-replace-regexp (concat "\\b" (regexp-quote word) "\\b")
  131.                    newword)))))))
  132.  
  133.  
  134. ;;;###autoload
  135. (defun spell-string (string)
  136.   "Check spelling of string supplied as argument."
  137.   (interactive "sSpell string: ")
  138.   (let ((buf (get-buffer-create " *temp*")))
  139.     (save-excursion
  140.      (set-buffer buf)
  141.      (widen)
  142.      (erase-buffer)
  143.      (insert string "\n")
  144.      (if (string= "spell" spell-command)
  145.      (call-process-region (point-min) (point-max) "spell"
  146.                   t t)
  147.        (call-process-region (point-min) (point-max) shell-file-name
  148.                 t t nil "-c" spell-command))
  149.      (if (= 0 (buffer-size))
  150.      (message "%s is correct" string)
  151.        (goto-char (point-min))
  152.        (while (search-forward "\n" nil t)
  153.      (replace-match " "))
  154.        (message "%sincorrect" (buffer-substring 1 (point-max)))))))
  155.  
  156. ;;; spell.el ends here
  157.